import { Response } from 'express';

/**
 * 统一API响应格式工具类
 * 提供标准化的API响应处理方法
 */
export default class ApiResponse {
	/**
	 * 成功响应 (使用data包裹)
	 * @param res Express响应对象
	 * @param data 响应数据
	 * @param msg 响应消息
	 * @param code 响应状态码
	 * @returns Express响应对象
	 */
	public static success(
		res: Response,
		data: any = null,
		msg: string = "操作成功",
		code: number = 200
	): Response {
		return res.status(200).json({
			code,
			msg,
			data: data || {}
		});
	}

	/**
	 * 成功响应 (不使用data包裹)
	 * @param res Express响应对象
	 * @param data 响应数据
	 * @param msg 响应消息
	 * @param code 响应状态码
	 * @returns Express响应对象
	 */
	public static successWithoutWrapper(
		res: Response,
		data: any = null,
		msg: string = "操作成功",
		code: number = 200
	): Response {
		return res.status(200).json({
			code,
			msg,
			...(data || {})
		});
	}

	/**
	 * 错误响应 (使用data包裹)
	 * @param res Express响应对象
	 * @param msg 错误消息
	 * @param code 错误状态码
	 * @param data 额外数据
	 * @returns Express响应对象
	 */
	public static error(
		res: Response,
		msg: string = "操作失败",
		code: number = 500,
		data: any = null
	): Response {
		return res.status(200).json({
			code,
			msg,
			data: data || {}
		});
	}

	/**
	 * 错误响应 (不使用data包裹)
	 * @param res Express响应对象
	 * @param msg 错误消息
	 * @param code 错误状态码
	 * @param data 额外数据
	 * @returns Express响应对象
	 */
	public static errorWithoutWrapper(
		res: Response,
		msg: string = "操作失败",
		code: number = 500,
		data: any = null
	): Response {
		return res.status(200).json({
			code,
			msg,
			...(data || {})
		});
	}

	/**
	 * 分页响应
	 * @param res Express响应对象
	 * @param list 数据列表
	 * @param total 总记录数
	 * @param current 当前页码
	 * @param pageSize 每页条数
	 * @param msg 响应消息
	 * @returns Express响应对象
	 */
	public static page(
		res: Response,
		list: any[],
		total: number,
		current: number = 1,
		pageSize: number = 10,
		msg: string = "查询成功"
	): Response {
		return res.status(200).json({
			code: 200,
			msg,
			rows: list,
			total,
			pageNum: current,
			pageSize,
		});
	}

	/**
	 * 表格数据响应（若依系统格式）
	 * @param res Express响应对象
	 * @param rows 数据行
	 * @param total 总记录数
	 * @param msg 响应消息
	 * @returns Express响应对象
	 */
	public static successWithTable(
		res: Response,
		rows: any[],
		total: number,
		msg: string = "查询成功",
		pageNum: number = 1,
		pageSize: number = 10
	): Response {
		return res.status(200).json({
			code: 200,
			msg,
			rows,
			total,
			pageNum,
			pageSize
		});
	}

	/**
	 * 未授权响应
	 * @param res Express响应对象
	 * @param msg 错误消息
	 * @returns Express响应对象
	 */
	public static unauthorized(
		res: Response,
		msg: string = "未授权或授权已过期"
	): Response {
		return this.error(res, msg, 401);
	}

	/**
	 * 禁止访问响应
	 * @param res Express响应对象
	 * @param msg 错误消息
	 * @returns Express响应对象
	 */
	public static forbidden(
		res: Response,
		msg: string = "禁止访问"
	): Response {
		return this.error(res, msg, 403);
	}

	/**
	 * 资源不存在响应
	 * @param res Express响应对象
	 * @param msg 错误消息
	 * @returns Express响应对象
	 */
	public static notFound(
		res: Response,
		msg: string = "资源不存在"
	): Response {
		return this.error(res, msg, 404);
	}
} 